package logger;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.logging.Level;

/**
 *
 * @author Marcos Garcia Ortega <a href="mailto:thiamath@gmail.com">&lt;thiamath@gmail.com&gt;</a>
 * @author Irene <a href="mailto:isjv87@gmail.com">&lt;isjv87@gmail.com&gt;</a>
 */
public class Logger {

	private static int logLevel;
	private static File logFile;

	public static void init(int logLevel, String logFilePath) throws IOException{
		Logger.logLevel = logLevel;
		DateFormat df = new SimpleDateFormat("dd_MM_yyyy");
		Logger.logFile = new File(logFilePath + df.format(Calendar.getInstance().getTime()) + ".log");
		Logger.logFile.createNewFile();
	}

	/**
	 * Escribe en el log el mensaje pasado por par'ametro con la severidad indicada.
	 * @param message El mensaje que se desea logear.
	 * @param severity La severidad del mensaje. Si el log est&aacute;
	 * configurado para ignorar mensajes de prioridad igual o inferior a
	 * &eacute;sta, el mensaje no ser&aacute; escrito.
	 */
	public static void log(String message, int severity){
		if(logLevel >= severity){
			try {
				FileOutputStream o = new FileOutputStream(logFile, true);
				OutputStreamWriter out = new OutputStreamWriter(o);
				out.write(message + "\n");
				out.close();
			} catch (FileNotFoundException ex) {
			} catch (IOException ex) {
			}
		}
	}

	/**
	 * Imprime el contenido del objeto pasado por par&aacute:metro en el log.<br />
	 * El objeto se imprimir&aacute: de la siguiente forma:<br />
	 * Objeto de clase [clase del objeto]:<br />
	 * [nombre de campo 1] = [valor del campo]<br />
	 * .<br />
	 * .<br />
	 * .<br />
	 * [nombre del campo n] = [valor del campo n]<br />
	 * <br />
	 * Se imprimir&aacute;n propiedades tanto p&uacute;blicas como privadas.
	 * @param object El objeto a imprimir.
	 * @param severity La severidad del log.
	 */
	public static void logObject(Object object, int severity){
		if(logLevel >= severity){
			try {
				FileOutputStream o = new FileOutputStream(logFile, true);
				OutputStreamWriter out = new OutputStreamWriter(o);

				Field[] fields = object.getClass().getDeclaredFields();

				out.write("Objeto de clase:" + object.getClass().getCanonicalName() + "\n");
				out.write("Campos:\n");
				for (Field field : fields) {
					try {
						Field.setAccessible(fields, true);
						out.write("\t" + field.getName() + " = " + field.get(object) + "\n");
					} catch (IllegalArgumentException ex) {
						java.util.logging.Logger.getLogger(Logger.class.getName()).log(Level.SEVERE, null, ex);
					} catch (IllegalAccessException ex) {
						java.util.logging.Logger.getLogger(Logger.class.getName()).log(Level.SEVERE, null, ex);
					}
				}

				out.close();
			} catch (FileNotFoundException ex) {
			} catch (IOException ex) {
			}
		}
	}

	public static final int VERBOSE = 0;
	public static final int LOW = 1;
	public static final int NORMAL = 2;
	public static final int HIGH = 3;
	public static final int CRITICAL = 4;
}
